Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[RNMobile] Fix UBE Text Selection Bug on Android #34668

Merged
merged 22 commits into from
Oct 8, 2021

Conversation

SiobhyB
Copy link
Contributor

@SiobhyB SiobhyB commented Sep 8, 2021

Fixes: wordpress-mobile/gutenberg-mobile#3862

Description

As outlined in more detail at wordpress-mobile/gutenberg-mobile#3862, the floating toolbar that appears when text is selected blocks access to dropdown menu items in some cases. This is specific to the Unsupported Block Editor (UBE) and can prevent users from being able to format their text selection.

With this PR, the text selection toolbar is now correctly dismissed when a "parent" menu item is tapped in the UBE's main toolbar, so users will always be able to access the dropdown menu items.

How has this been tested?

  1. In a browser, add a block that's unsupported in the apps to a post e.g. the timeline block on a WordPress.com site.
  2. In the Android app, open the post, tap the question mark alongside the unsupported block, and then Edit using web editor.
  3. Enter some text into the UBE and select some of it, so that the text selection toolbar pops up.
  4. Tap the chevron icon in the toolbar to view the formatting options in the dropdown menu.
    • Before fix: The text selection toolbar is not dismissed when the icon is tapped, making some of the menu items inaccessible.
    • With fix: The text selection toolbar is dismissed when the icon is tapped.

Screenshots

You'll see that the text selection toolbar is now being correctly dismissed, while maintaining the selection.

Screen.Recording.2021-09-20.at.12.04.54.mov

Types of changes

This PR introduces a bug fix (a non-breaking change which fixes an issue), with the following high-level notes on the code changes:

Initial solution, before refactor:
Updated, current solution:
  • A function named hideTextSelectionContextMenu is used to notify the Android side of the codebase when buttons impacted by the bug are tapped.
  • Android's ActionMode hides text selection toolbar whenever the hideTextSelectionContextMenu function is called. More specficially, ActionMode's finish method is utilised to remove the toolbar.
  • The changes in 4f1ca31 prevent the need for the dropdown menu to be tapped a second time after the text selection toolbar is dismissed.

Checklist:

  • My code is tested.
  • My code follows the WordPress code style.
  • My code follows the accessibility standards.
  • I've tested my changes with keyboard and screen readers.
  • My code has proper inline documentation.
  • I've included developer documentation if appropriate.
  • I've updated all React Native files affected by any refactorings/renamings in this PR (please manually search all *.native.js files for terms that need renaming or removal).

Siobhan added 3 commits September 8, 2021 22:06
With this commit, a new JS file is loaded in 'GutenbergWebViewActivity.java'. This new file will have our custom JS, which will load when the UBE is open.
An event listener is added as part of this commit, which will listen for changes in focus in the UBE. In addition, an if statement that checks for the specific elements we're interested in (the toolbars dropdown menus) has been added. This if statement will be fleshed out in future commits.
The text selection is reset by utilising JavaScript's setBaseAndExtent' method. This has the effect of removing the text selection toolbar when a dropdown menu is pressed, while maintaining the original selection.

See here for more details on setBaseAndExtent: https://developer.mozilla.org/en-US/docs/Web/API/Selection/setBaseAndExtent
@SiobhyB SiobhyB changed the title Load new custom JS file in UBE Fix UBE Text Selection Bug on Android Sep 8, 2021
@github-actions
Copy link

github-actions bot commented Sep 9, 2021

Size Change: +2.16 kB (0%)

Total Size: 1.07 MB

Filename Size Change
build/block-editor/index.min.js 135 kB +137 B (0%)
build/block-editor/style-rtl.css 13.9 kB +3 B (0%)
build/block-editor/style.css 13.9 kB +3 B (0%)
build/block-library/blocks/cover/style-rtl.css 1.24 kB +12 B (+1%)
build/block-library/blocks/cover/style.css 1.24 kB +12 B (+1%)
build/block-library/blocks/navigation/editor-rtl.css 1.72 kB -2 B (0%)
build/block-library/blocks/navigation/editor.css 1.72 kB -1 B (0%)
build/block-library/blocks/site-logo/editor-rtl.css 769 B +303 B (+65%) 🆘
build/block-library/blocks/site-logo/editor.css 769 B +302 B (+65%) 🆘
build/block-library/blocks/site-logo/style-rtl.css 165 B +12 B (+8%) 🔍
build/block-library/blocks/site-logo/style.css 165 B +12 B (+8%) 🔍
build/block-library/editor-rtl.css 9.89 kB +179 B (+2%)
build/block-library/editor.css 9.89 kB +179 B (+2%)
build/block-library/index.min.js 147 kB +645 B (0%)
build/block-library/style-rtl.css 10.4 kB +19 B (0%)
build/block-library/style.css 10.5 kB +19 B (0%)
build/components/index.min.js 214 kB +409 B (0%)
build/components/style-rtl.css 15.9 kB +4 B (0%)
build/components/style.css 15.9 kB +5 B (0%)
build/reusable-blocks/index.min.js 2.19 kB -90 B (-4%)
ℹ️ View Unchanged
Filename Size
build/a11y/index.min.js 931 B
build/admin-manifest/index.min.js 1.09 kB
build/annotations/index.min.js 2.7 kB
build/api-fetch/index.min.js 2.21 kB
build/autop/index.min.js 2.08 kB
build/blob/index.min.js 459 B
build/block-directory/index.min.js 6.2 kB
build/block-directory/style-rtl.css 1.01 kB
build/block-directory/style.css 1.01 kB
build/block-editor/default-editor-styles-rtl.css 378 B
build/block-editor/default-editor-styles.css 378 B
build/block-library/blocks/archives/editor-rtl.css 61 B
build/block-library/blocks/archives/editor.css 60 B
build/block-library/blocks/archives/style-rtl.css 65 B
build/block-library/blocks/archives/style.css 65 B
build/block-library/blocks/audio/editor-rtl.css 58 B
build/block-library/blocks/audio/editor.css 58 B
build/block-library/blocks/audio/style-rtl.css 111 B
build/block-library/blocks/audio/style.css 111 B
build/block-library/blocks/audio/theme-rtl.css 125 B
build/block-library/blocks/audio/theme.css 125 B
build/block-library/blocks/block/editor-rtl.css 161 B
build/block-library/blocks/block/editor.css 161 B
build/block-library/blocks/button/editor-rtl.css 474 B
build/block-library/blocks/button/editor.css 474 B
build/block-library/blocks/button/style-rtl.css 600 B
build/block-library/blocks/button/style.css 600 B
build/block-library/blocks/buttons/editor-rtl.css 315 B
build/block-library/blocks/buttons/editor.css 315 B
build/block-library/blocks/buttons/style-rtl.css 370 B
build/block-library/blocks/buttons/style.css 370 B
build/block-library/blocks/calendar/style-rtl.css 207 B
build/block-library/blocks/calendar/style.css 207 B
build/block-library/blocks/categories/editor-rtl.css 84 B
build/block-library/blocks/categories/editor.css 83 B
build/block-library/blocks/categories/style-rtl.css 79 B
build/block-library/blocks/categories/style.css 79 B
build/block-library/blocks/code/style-rtl.css 90 B
build/block-library/blocks/code/style.css 90 B
build/block-library/blocks/code/theme-rtl.css 131 B
build/block-library/blocks/code/theme.css 131 B
build/block-library/blocks/columns/editor-rtl.css 206 B
build/block-library/blocks/columns/editor.css 205 B
build/block-library/blocks/columns/style-rtl.css 497 B
build/block-library/blocks/columns/style.css 496 B
build/block-library/blocks/cover/editor-rtl.css 666 B
build/block-library/blocks/cover/editor.css 670 B
build/block-library/blocks/embed/editor-rtl.css 488 B
build/block-library/blocks/embed/editor.css 488 B
build/block-library/blocks/embed/style-rtl.css 417 B
build/block-library/blocks/embed/style.css 417 B
build/block-library/blocks/embed/theme-rtl.css 124 B
build/block-library/blocks/embed/theme.css 124 B
build/block-library/blocks/file/editor-rtl.css 300 B
build/block-library/blocks/file/editor.css 300 B
build/block-library/blocks/file/style-rtl.css 255 B
build/block-library/blocks/file/style.css 255 B
build/block-library/blocks/file/view.min.js 322 B
build/block-library/blocks/freeform/editor-rtl.css 2.44 kB
build/block-library/blocks/freeform/editor.css 2.44 kB
build/block-library/blocks/gallery/editor-rtl.css 977 B
build/block-library/blocks/gallery/editor.css 982 B
build/block-library/blocks/gallery/style-rtl.css 1.6 kB
build/block-library/blocks/gallery/style.css 1.59 kB
build/block-library/blocks/gallery/theme-rtl.css 122 B
build/block-library/blocks/gallery/theme.css 122 B
build/block-library/blocks/group/editor-rtl.css 159 B
build/block-library/blocks/group/editor.css 159 B
build/block-library/blocks/group/style-rtl.css 57 B
build/block-library/blocks/group/style.css 57 B
build/block-library/blocks/group/theme-rtl.css 78 B
build/block-library/blocks/group/theme.css 78 B
build/block-library/blocks/heading/style-rtl.css 114 B
build/block-library/blocks/heading/style.css 114 B
build/block-library/blocks/home-link/style-rtl.css 247 B
build/block-library/blocks/home-link/style.css 247 B
build/block-library/blocks/html/editor-rtl.css 332 B
build/block-library/blocks/html/editor.css 333 B
build/block-library/blocks/image/editor-rtl.css 731 B
build/block-library/blocks/image/editor.css 730 B
build/block-library/blocks/image/style-rtl.css 491 B
build/block-library/blocks/image/style.css 494 B
build/block-library/blocks/image/theme-rtl.css 124 B
build/block-library/blocks/image/theme.css 124 B
build/block-library/blocks/latest-comments/style-rtl.css 284 B
build/block-library/blocks/latest-comments/style.css 284 B
build/block-library/blocks/latest-posts/editor-rtl.css 137 B
build/block-library/blocks/latest-posts/editor.css 137 B
build/block-library/blocks/latest-posts/style-rtl.css 528 B
build/block-library/blocks/latest-posts/style.css 527 B
build/block-library/blocks/list/style-rtl.css 94 B
build/block-library/blocks/list/style.css 94 B
build/block-library/blocks/media-text/editor-rtl.css 266 B
build/block-library/blocks/media-text/editor.css 263 B
build/block-library/blocks/media-text/style-rtl.css 493 B
build/block-library/blocks/media-text/style.css 490 B
build/block-library/blocks/more/editor-rtl.css 431 B
build/block-library/blocks/more/editor.css 431 B
build/block-library/blocks/navigation-link/editor-rtl.css 568 B
build/block-library/blocks/navigation-link/editor.css 570 B
build/block-library/blocks/navigation-link/style-rtl.css 94 B
build/block-library/blocks/navigation-link/style.css 94 B
build/block-library/blocks/navigation-submenu/editor-rtl.css 300 B
build/block-library/blocks/navigation-submenu/editor.css 299 B
build/block-library/blocks/navigation-submenu/style-rtl.css 195 B
build/block-library/blocks/navigation-submenu/style.css 195 B
build/block-library/blocks/navigation-submenu/view.min.js 343 B
build/block-library/blocks/navigation/style-rtl.css 1.62 kB
build/block-library/blocks/navigation/style.css 1.61 kB
build/block-library/blocks/navigation/view.min.js 2.74 kB
build/block-library/blocks/nextpage/editor-rtl.css 395 B
build/block-library/blocks/nextpage/editor.css 395 B
build/block-library/blocks/page-list/editor-rtl.css 377 B
build/block-library/blocks/page-list/editor.css 377 B
build/block-library/blocks/page-list/style-rtl.css 198 B
build/block-library/blocks/page-list/style.css 198 B
build/block-library/blocks/paragraph/editor-rtl.css 157 B
build/block-library/blocks/paragraph/editor.css 157 B
build/block-library/blocks/paragraph/style-rtl.css 273 B
build/block-library/blocks/paragraph/style.css 273 B
build/block-library/blocks/post-author/editor-rtl.css 210 B
build/block-library/blocks/post-author/editor.css 210 B
build/block-library/blocks/post-author/style-rtl.css 182 B
build/block-library/blocks/post-author/style.css 181 B
build/block-library/blocks/post-comments-form/style-rtl.css 140 B
build/block-library/blocks/post-comments-form/style.css 140 B
build/block-library/blocks/post-comments/style-rtl.css 360 B
build/block-library/blocks/post-comments/style.css 359 B
build/block-library/blocks/post-excerpt/editor-rtl.css 73 B
build/block-library/blocks/post-excerpt/editor.css 73 B
build/block-library/blocks/post-excerpt/style-rtl.css 69 B
build/block-library/blocks/post-excerpt/style.css 69 B
build/block-library/blocks/post-featured-image/editor-rtl.css 396 B
build/block-library/blocks/post-featured-image/editor.css 397 B
build/block-library/blocks/post-featured-image/style-rtl.css 146 B
build/block-library/blocks/post-featured-image/style.css 146 B
build/block-library/blocks/post-template/editor-rtl.css 99 B
build/block-library/blocks/post-template/editor.css 98 B
build/block-library/blocks/post-template/style-rtl.css 391 B
build/block-library/blocks/post-template/style.css 392 B
build/block-library/blocks/post-terms/style-rtl.css 73 B
build/block-library/blocks/post-terms/style.css 73 B
build/block-library/blocks/post-title/style-rtl.css 60 B
build/block-library/blocks/post-title/style.css 60 B
build/block-library/blocks/preformatted/style-rtl.css 103 B
build/block-library/blocks/preformatted/style.css 103 B
build/block-library/blocks/pullquote/editor-rtl.css 198 B
build/block-library/blocks/pullquote/editor.css 198 B
build/block-library/blocks/pullquote/style-rtl.css 378 B
build/block-library/blocks/pullquote/style.css 378 B
build/block-library/blocks/pullquote/theme-rtl.css 167 B
build/block-library/blocks/pullquote/theme.css 167 B
build/block-library/blocks/query-pagination-numbers/editor-rtl.css 122 B
build/block-library/blocks/query-pagination-numbers/editor.css 121 B
build/block-library/blocks/query-pagination/editor-rtl.css 262 B
build/block-library/blocks/query-pagination/editor.css 255 B
build/block-library/blocks/query-pagination/style-rtl.css 234 B
build/block-library/blocks/query-pagination/style.css 231 B
build/block-library/blocks/query-title/editor-rtl.css 85 B
build/block-library/blocks/query-title/editor.css 85 B
build/block-library/blocks/query/editor-rtl.css 131 B
build/block-library/blocks/query/editor.css 132 B
build/block-library/blocks/quote/style-rtl.css 187 B
build/block-library/blocks/quote/style.css 187 B
build/block-library/blocks/quote/theme-rtl.css 220 B
build/block-library/blocks/quote/theme.css 222 B
build/block-library/blocks/rss/editor-rtl.css 202 B
build/block-library/blocks/rss/editor.css 204 B
build/block-library/blocks/rss/style-rtl.css 289 B
build/block-library/blocks/rss/style.css 288 B
build/block-library/blocks/search/editor-rtl.css 165 B
build/block-library/blocks/search/editor.css 165 B
build/block-library/blocks/search/style-rtl.css 374 B
build/block-library/blocks/search/style.css 375 B
build/block-library/blocks/search/theme-rtl.css 64 B
build/block-library/blocks/search/theme.css 64 B
build/block-library/blocks/separator/editor-rtl.css 99 B
build/block-library/blocks/separator/editor.css 99 B
build/block-library/blocks/separator/style-rtl.css 250 B
build/block-library/blocks/separator/style.css 250 B
build/block-library/blocks/separator/theme-rtl.css 172 B
build/block-library/blocks/separator/theme.css 172 B
build/block-library/blocks/shortcode/editor-rtl.css 474 B
build/block-library/blocks/shortcode/editor.css 474 B
build/block-library/blocks/site-tagline/editor-rtl.css 86 B
build/block-library/blocks/site-tagline/editor.css 86 B
build/block-library/blocks/site-title/editor-rtl.css 84 B
build/block-library/blocks/site-title/editor.css 84 B
build/block-library/blocks/social-link/editor-rtl.css 165 B
build/block-library/blocks/social-link/editor.css 165 B
build/block-library/blocks/social-links/editor-rtl.css 812 B
build/block-library/blocks/social-links/editor.css 811 B
build/block-library/blocks/social-links/style-rtl.css 1.3 kB
build/block-library/blocks/social-links/style.css 1.3 kB
build/block-library/blocks/spacer/editor-rtl.css 307 B
build/block-library/blocks/spacer/editor.css 307 B
build/block-library/blocks/spacer/style-rtl.css 48 B
build/block-library/blocks/spacer/style.css 48 B
build/block-library/blocks/table/editor-rtl.css 471 B
build/block-library/blocks/table/editor.css 472 B
build/block-library/blocks/table/style-rtl.css 481 B
build/block-library/blocks/table/style.css 481 B
build/block-library/blocks/table/theme-rtl.css 188 B
build/block-library/blocks/table/theme.css 188 B
build/block-library/blocks/tag-cloud/style-rtl.css 146 B
build/block-library/blocks/tag-cloud/style.css 146 B
build/block-library/blocks/template-part/editor-rtl.css 636 B
build/block-library/blocks/template-part/editor.css 635 B
build/block-library/blocks/template-part/theme-rtl.css 101 B
build/block-library/blocks/template-part/theme.css 101 B
build/block-library/blocks/term-description/editor-rtl.css 90 B
build/block-library/blocks/term-description/editor.css 90 B
build/block-library/blocks/text-columns/editor-rtl.css 95 B
build/block-library/blocks/text-columns/editor.css 95 B
build/block-library/blocks/text-columns/style-rtl.css 166 B
build/block-library/blocks/text-columns/style.css 166 B
build/block-library/blocks/verse/style-rtl.css 87 B
build/block-library/blocks/verse/style.css 87 B
build/block-library/blocks/video/editor-rtl.css 571 B
build/block-library/blocks/video/editor.css 572 B
build/block-library/blocks/video/style-rtl.css 173 B
build/block-library/blocks/video/style.css 173 B
build/block-library/blocks/video/theme-rtl.css 124 B
build/block-library/blocks/video/theme.css 124 B
build/block-library/common-rtl.css 853 B
build/block-library/common.css 849 B
build/block-library/reset-rtl.css 474 B
build/block-library/reset.css 474 B
build/block-library/theme-rtl.css 665 B
build/block-library/theme.css 669 B
build/block-serialization-default-parser/index.min.js 1.09 kB
build/block-serialization-spec-parser/index.min.js 2.79 kB
build/blocks/index.min.js 45.7 kB
build/compose/index.min.js 10.3 kB
build/core-data/index.min.js 12.4 kB
build/customize-widgets/index.min.js 11.2 kB
build/customize-widgets/style-rtl.css 1.5 kB
build/customize-widgets/style.css 1.49 kB
build/data-controls/index.min.js 614 B
build/data/index.min.js 7.1 kB
build/date/index.min.js 31.5 kB
build/deprecated/index.min.js 428 B
build/dom-ready/index.min.js 304 B
build/dom/index.min.js 4.45 kB
build/edit-navigation/index.min.js 15.3 kB
build/edit-navigation/style-rtl.css 3.74 kB
build/edit-navigation/style.css 3.74 kB
build/edit-post/classic-rtl.css 492 B
build/edit-post/classic.css 494 B
build/edit-post/index.min.js 29.2 kB
build/edit-post/style-rtl.css 7.2 kB
build/edit-post/style.css 7.19 kB
build/edit-site/index.min.js 29.4 kB
build/edit-site/style-rtl.css 5.5 kB
build/edit-site/style.css 5.5 kB
build/edit-widgets/index.min.js 15.7 kB
build/edit-widgets/style-rtl.css 4.1 kB
build/edit-widgets/style.css 4.1 kB
build/editor/index.min.js 37.5 kB
build/editor/style-rtl.css 3.76 kB
build/editor/style.css 3.75 kB
build/element/index.min.js 3.17 kB
build/escape-html/index.min.js 517 B
build/format-library/index.min.js 5.93 kB
build/format-library/style-rtl.css 571 B
build/format-library/style.css 571 B
build/hooks/index.min.js 1.55 kB
build/html-entities/index.min.js 424 B
build/i18n/index.min.js 3.6 kB
build/is-shallow-equal/index.min.js 501 B
build/keyboard-shortcuts/index.min.js 1.72 kB
build/keycodes/index.min.js 1.3 kB
build/list-reusable-blocks/index.min.js 1.85 kB
build/list-reusable-blocks/style-rtl.css 838 B
build/list-reusable-blocks/style.css 838 B
build/media-utils/index.min.js 2.92 kB
build/notices/index.min.js 845 B
build/nux/index.min.js 2.03 kB
build/nux/style-rtl.css 747 B
build/nux/style.css 743 B
build/plugins/index.min.js 1.83 kB
build/primitives/index.min.js 921 B
build/priority-queue/index.min.js 582 B
build/react-i18n/index.min.js 671 B
build/redux-routine/index.min.js 2.63 kB
build/reusable-blocks/style-rtl.css 256 B
build/reusable-blocks/style.css 256 B
build/rich-text/index.min.js 10.6 kB
build/server-side-render/index.min.js 1.5 kB
build/shortcode/index.min.js 1.48 kB
build/token-list/index.min.js 562 B
build/url/index.min.js 1.74 kB
build/viewport/index.min.js 1.02 kB
build/warning/index.min.js 248 B
build/widgets/index.min.js 7.11 kB
build/widgets/style-rtl.css 1.16 kB
build/widgets/style.css 1.16 kB
build/wordcount/index.min.js 1.04 kB

compressed-size-action

@SiobhyB SiobhyB changed the title Fix UBE Text Selection Bug on Android [RNMobile] Fix UBE Text Selection Bug on Android Sep 9, 2021
Siobhan added 3 commits September 19, 2021 16:14
This PR renames the 'custom-js' file to 'editor-behavior-overrides.js' in an attempt to clarify its purpose.
As this is a somewhat hacky and unintuitive fix, this commit adds a clarifying comment along with a link back to the PR for more details.
@SiobhyB SiobhyB added Mobile App - i.e. Android or iOS Native mobile impl of the block editor. (Note: used in scripts, ping mobile folks to change) [Type] Bug An existing feature does not function as intended labels Sep 20, 2021
The if/else statement was only checking whether specific buttons were active before resetting the text selection. With this commit, an extra check for whether text is actually selected has been added. The code for resetting the selection will therefore only be run when necessary (i.e. it's not necessary if there's no selection).
Siobhan and others added 4 commits September 20, 2021 11:39
With this commit, changes are made to access the 'activeElement' via 'document', rather than 'window'. Accessing directly via 'window' was not working as expected. It was necessary to still reference 'window' to bypass lint errors.
This was accidentally removed with the last commit.
@SiobhyB
Copy link
Contributor Author

SiobhyB commented Sep 20, 2021

@fluiddot, would you maybe have the time to review this PR this week? I've attempted to outline the reasoning behind the changes as clearly as possible, but it's also a pretty hacky fix and I'd be happy to clarify anything (via Zoom or text) if needed.

I've also generated an installable build that's available at wordpress-mobile/WordPress-Android#15304.

@SiobhyB SiobhyB marked this pull request as ready for review September 20, 2021 11:39
@fluiddot
Copy link
Contributor

@fluiddot, would you maybe have the time to review this PR this week? I've attempted to outline the reasoning behind the changes as clearly as possible, but it's also a pretty hacky fix and I'd be happy to clarify anything (via Zoom or text) if needed.

I've also generated an installable build that's available at wordpress-mobile/WordPress-Android#15304.

Sure, I'll spare some time this week to review it 👍, I'll also assign myself as a reviewer.

@fluiddot fluiddot self-requested a review September 20, 2021 12:14
Siobhan added 5 commits September 29, 2021 00:12
Previously the selected text was reset on the JavaScript side of the codebase (using the 'setBaseAndExtent' method). This commit refactors the code so that the Android side of the codebase is notified instead, via the newly created 'hideTextSelectionContextMenu' method. The aim here is to make use of Android's built-in functions around ActionMode, in order to make the code and functionality more stable.
This commit taps into Android's ActionMode to hide the text selection toolbar whenever the 'hideTextSelectionContextMenu' function is called.

More specficially, it uses the 'finish' method: https://developer.android.com/reference/android/view/ActionMode#finish()
I accidentally ommitted the 'mActionMode' variable from previous commits.
@SiobhyB
Copy link
Contributor Author

SiobhyB commented Sep 29, 2021

@fluiddot, I've refactored this PR, following our Zoom, to utilise Android's ActionMode and the installable build can be found here.

I initially tried using the hide method, but realised that this will only ever hide the menu for a few seconds, no matter what number is passed. I took a screen recording to show the menu displaying again after just a few seconds, despite the fact I'd passed 10000 (10 seconds) to the method:

UBE.hide.recording.mov

This limitation of hide is also backed up in the documentation:

NOTE that there is an internal limit to how long the mode can be hidden for. It's typically about a few seconds.

finish was the only method that did the job fully for me, though it still means that the menu items need to be tapped twice when there's a text selection. I experimented a little with ways around this (such as using JavaScript's click() method) but couldn't quite get this working.

Let me know if you think there's still a way that we could prevent the need for two taps here, I'd love to get it working without that quirk, if possible. 🙇‍♀️ If it's not possible, I think two taps would still be a better experience than the current blocking behaviour.

@fluiddot
Copy link
Contributor

fluiddot commented Oct 4, 2021

@fluiddot, I've refactored this PR, following our Zoom, to utilise Android's ActionMode and the installable build can be found here.

I initially tried using the hide method, but realised that this will only ever hide the menu for a few seconds, no matter what number is passed. I took a screen recording to show the menu displaying again after just a few seconds, despite the fact I'd passed 10000 (10 seconds) to the method:

UBE.hide.recording.mov
This limitation of hide is also backed up in the documentation:

NOTE that there is an internal limit to how long the mode can be hidden for. It's typically about a few seconds.

Thanks for trying the approach with the hide function, I didn't have too much hope on that option but it was worth trying it, too bad it didn't work 😞 .

finish was the only method that did the job fully for me, though it still means that the menu items need to be tapped twice when there's a text selection. I experimented a little with ways around this (such as using JavaScript's click() method) but couldn't quite get this working.

Let me know if you think there's still a way that we could prevent the need for two taps here, I'd love to get it working without that quirk, if possible. 🙇‍♀️ If it's not possible, I think two taps would still be a better experience than the current blocking behaviour.

I explored the idea you had about automatically clicking the button when hiding the floating bar and I implemented it in this commit. So far looks like addresses the issue and doesn't require the double-tap 🎊 . It would be great if we test it further and if it goes well, I think we could wrap up the PR and merge it.

@SiobhyB
Copy link
Contributor Author

SiobhyB commented Oct 4, 2021

@fluiddot, thanks so much for this 🙇‍♀️ I created a new installable build here and tested it on a physical Pixel 5. It worked well, with a slight flicker, which we discussed isn't avoidable with this approach. I didn't find it jarring, though, and think it seems like a good solution.

@fluiddot
Copy link
Contributor

fluiddot commented Oct 6, 2021

@SiobhyB I've implemented a new approach because I noticed that for some of the dropdown menus the last solution I implemented wasn't hiding the floating menu. For the new solution, I refactored a bit the code and now instead of listening to focus events, we listen to clicks. This way we can prevent the propagation of the event and delay the click right after the context menu is hidden, which prevents flickering. Besides, I added listeners to know when the context menu is visible and only override the click event if it's being shown.

I've tested further and I think this could be definitive solution for this 🤞 , nevertheless, I'd appreciate it if we could test it again before approving it. Let me know your opinion regarding this approach and if you'd like to continue with it. Otherwise, I'll be more than happy to revert it and go with the previous approach 👍 .

@SiobhyB
Copy link
Contributor Author

SiobhyB commented Oct 8, 2021

@fluiddot, sorry I didn't get back to you yesterday! I wanted to make sure I took the time to understand the changes that have been implemented. I've done that now and it all makes sense to me, I also created another installable build and confirmed all works super smoothly on my Pixel 5 🎉

To tie things up, I created the issue for the mobile web at #35447, as we discussed.

I'm happy to ship this if you are now, too :D

@fluiddot
Copy link
Contributor

fluiddot commented Oct 8, 2021

@fluiddot, sorry I didn't get back to you yesterday! I wanted to make sure I took the time to understand the changes that have been implemented. I've done that now and it all makes sense to me, I also created another installable build and confirmed all works super smoothly on my Pixel 5 🎉

No worries, I'm happy to see that works smoothly 😊. If you have any doubt about the changes I made please let me know, I'll be more than happy to jump into a quick call to explain them.

To tie things up, I created the issue for the mobile web at #35447, as we discussed.

Awesome, thanks for creating the issue 🙇 .

I'm happy to ship this if you are now, too :D

Yeah, I'm going to do a final review as double-check but I think we already tested enough to merge it.

Copy link
Contributor

@fluiddot fluiddot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGMT 🎊 !

Tested on Simulator - iPhone 12 Pro Max (iOS 14.5) and Samsung Galaxy S20 FE 5G (Android 10).

@SiobhyB
Copy link
Contributor Author

SiobhyB commented Oct 8, 2021

Thanks so much for all your support on this one, @fluiddot 🙇‍♀️

I'll go ahead with the merge domino! :D

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Mobile App - i.e. Android or iOS Native mobile impl of the block editor. (Note: used in scripts, ping mobile folks to change) [Type] Bug An existing feature does not function as intended
Projects
None yet
Development

Successfully merging this pull request may close these issues.

UBE: Android text selection toolbar is blocking access to dropdown menus
2 participants